//解题思路：
//    1. s的数据大于k，可进行部分逆置。 如果部分逆置后剩下的数据不足以进行部分逆置，则对剩下的数据特殊处理
//         1)剩下的数据小于k，直接对剩下的数据全部逆置
//         2)剩下的数据大于等于k，取剩下数据的前k个部分逆置即可

//    2. s的数据小于k，可直接进行全部逆置

//注意事项：优先判断2.


class Solution
{
public:
    string reverseStr(string s, int k)
    {
        int K = 2 * k;
        int size = s.length();
        int i = K - 1;//i是一次逆置中，最后一个数据的位置（不是要逆置的数据位置，是本次要逆置的片段的最后一个数据）

        auto prev = s.begin();//prev是部分逆置的起点位置

        if (s.length() < k)//如果s的数据不足k个，则直接全部逆置
        {
            reverse(s.begin(), s.end());
            return s;
        }

        for (i; i < size; i += K)//当s的数据有k个以上的时候，可进行部分逆序
        {
            reverse(prev, prev + k);//逆置prev后面的k个数，reverse的使用规则是[左闭右开)
            prev += K;
        }

        auto last = s.end();
        auto ret = prev;

        int num = 1;
        int flag = 0;
        while (num < k)//判断剩下的数是大于等于k，还是小于k
        {
            if (ret == s.end())//当ret等于s.end()时，数组全部遍历结束（s.end()是数组最后一位的下一个位置）
            {
                flag = 1;
                break;
            }
            num++;
            ret++;
        }
        //如果程序正常结束，就说明剩余的数大于等于k个数
        //那么flag此时等于0

        //如果是在遍历的途中跳出，就说明剩余的数小于k个数，接下来可以逆置剩下的全部数
        //flag = 1

        if (prev + K != s.end() - 1)//如果i的上一个结束位置不是数组的最后位置（不是全部逆置结束的情况）,就进入特殊处理阶段
        {
            if (flag == 0)//大于等于k个，只逆转前k个
            {
                reverse(prev, prev + k);
            }
            else//小于k个，剩下的全部逆转
            {
                reverse(prev, last);
            }
        }
        return s;
    }
};